package com.smart.common.smart;

import org.apache.commons.io.FileUtils;
import org.apache.commons.lang.StringUtils;

import java.io.File;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Scanner;
import java.util.Set;
import java.util.TreeSet;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * @author arnold.zhao
 * @date 2018/10/18 14:00
 */
public class UpdateUtils {
    /**
     * 输入需要更新的svn文件路径，具体就是svn的文件提交路径
     * 	例如：
     *  /src/robot/app/kbase-demo/src/main/java/com/eastrobot/module/category/dao/CategoryDao.java
     /src/robot/app/kbase-demo/src/main/java/com/eastrobot/module/corrections/service/impl/CorrectionsServiceImpl.java
     /src/robot/app/kbase-demo/src/main/java/com/eastrobot/module/corrections/vo/CorrectionsExport.java
     /src/robot/app/kbase-demo/src/main/java/com/eastrobot/module/corrections/vo/SatisfationtypeUtil.java
     /src/robot/app/kbase-demo/src/main/java/com/eastrobot/web/app/corrections/SatisfactionAction.java
     /src/robot/app/kbase-demo/src/main/webapp/WEB-INF/app/corrections/detailsatisfaction.jsp
     /src/robot/app/kbase-demo/src/main/webapp/WEB-INF/app/corrections/satisfactionreport.jsp
     或者
     Modified : /src/robot/app/kbase-demo/src/main/java/com/eastrobot/module/category/dao/CategoryDao.java
     Modified : /src/robot/app/kbase-demo/src/main/java/com/eastrobot/module/corrections/service/impl/CorrectionsServiceImpl.java
     Modified : /src/robot/app/kbase-demo/src/main/java/com/eastrobot/module/corrections/vo/CorrectionsExport.java
     Modified : /src/robot/app/kbase-demo/src/main/java/com/eastrobot/module/corrections/vo/SatisfationtypeUtil.java
     Added : /src/robot/app/kbase-demo/src/main/java/com/eastrobot/module/point/service/impl/PStrategyExtServiceImpl.java
     Modified : /src/robot/app/kbase-demo/src/main/java/com/eastrobot/util/database/SqlCriteria.java
     * @author Gassol.Bi
     * @date Oct 11, 2016 7:55:23 PM
     *
     * @return
     */
    public static List<String> getDatas() {
        List<String> paths = new ArrayList<String>();
        try {
            System.out.println("请输入内容，输入“end”结束：");

            Scanner scanner = new Scanner(System.in);// 获取控制台输入
            Set<String> datas = new TreeSet<String>();// 存储输入的字符

            String str = "";
            while (!str.equals("end")) {
                if(StringUtils.isNotBlank(str))
                    datas.add(str);
                str = scanner.nextLine();
            }
            // 返回数据
            paths.addAll(datas);

            // 数据处理
            for (int i = 0; i < paths.size(); i++) {
                String path = paths.get(i);
                path = path.replace("\\", "/").replace(".java", ".class");
                path = path.replaceAll("(Modified : )|(Added : )", "");
                path = path.replace("/src/robot/app/kbase-demo/src/main/java/", "/");
                path = path.replace("/src/robot/app/kbase-demo/src/main/resources/", "/");
                path = path.replace("/src/robot/app/kbase-demo/src/main/webapp/", "/");
                path = path.replace("src/main/java/", "/");
                path = path.replace("src/main/webapp/resource/", "/");
                path = path.replace("src/main/webapp/", "/");
                path = path.replace("/", "\\");
                // 替换为新元素
                paths.remove(i);
                paths.add(i, path);
                System.out.println(path);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return paths;
    }

    /**
     * 打包获取文件
     *
     * @author Gassol.Bi
     * @date Oct 11, 2016 7:04:03 PM
     *
     * @param allFiles
     * @param resPath
     * @return
     */
    public static void getFiles(List<File> allFiles, String resPath) {
        // 如果当前文件或目录存在
        File dir = new File(resPath);
        if (dir.exists()) {
            // 如果是目录，则：
            if (dir.isDirectory()) {
                // 获取该目录下的所有文件和目录组成的File数组
                File[] files = dir.listFiles();
                // 递归遍历每一个子文件
                for (File file : files) {
                    getFiles(allFiles, file.getPath());
                }
            } else {
                // 如果是文件，则打印该文件路径及名称
                allFiles.add(dir);
            }
        }
    }

    /**
     * 文件导出
     *
     * @author Gassol.Bi
     * @date Oct 11, 2016 5:36:19 PM
     *
     * @param resPath
     * @param trgPath
     */
    @SuppressWarnings("unchecked")
    public static void export(String resPath, String trgPath) {
        try {
			/* 需要更新的文件位置 */
            final List<String> paths = order(getDatas());
			/* 遍历源文件路径 */
            List<File> allFiles = new ArrayList<File>();
            getFiles(allFiles, resPath);// 获取所有文件
            // 筛选结果文件
            List<File> filterFiles = new ArrayList<File>();
            for (File file : allFiles) {
                String name = file.getName();// 文件名称
                String path = file.getPath();// 文件路径
                for (String str : paths) {
                    // 文件位置匹配(完全匹配，包含jar\js\class)
                    if (path.indexOf(str) > -1) {
                        filterFiles.add(file);
                    } else {
                        // 不完全匹配，针对class内部类
                        if(StringUtils.endsWithIgnoreCase(name, ".class")){
                            String suffix = str.substring(str.lastIndexOf("\\")+1)
                                    .replace(".class", "");
                            if (isRegularRptCode(name, suffix
                                    + "\\$[^\\.]+\\.class$")) {
                                filterFiles.add(file);
                            }
                        }
                    }
                }
            }

            for (File file : filterFiles) {
                FileUtils.copyFile(file, new File(file.getPath().replace(
                        resPath, trgPath)));
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 验证字符串是否符合正则表达式
     * @param str 字符串
     * @param regex 正则表达式
     * @return
     */
    public static boolean isRegularRptCode(String str, String regex) {
        if(str == null || regex == null) return false;
        Pattern pattern = Pattern.compile(regex);
        Matcher matcher = pattern.matcher(str);
        return matcher.matches();
    }
    /**
     * 获取字符串gbk编码
     * @param str
     * @return
     */
    public static Integer[] toIntValueGBK(String str){
        char[] chars = str.toCharArray();
        Integer[] ints = new Integer[chars.length];
        for (int i = 0; i < chars.length; i++) {
            try {
                ints[i] = toIntValueGBK(chars[i]);
            } catch (UnsupportedEncodingException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        return ints;
    }

    /**
     * 获取字符gbk编码
     * @param c
     * @return
     * @throws UnsupportedEncodingException
     */
    public static Integer toIntValueGBK(char c) throws UnsupportedEncodingException{
        StringBuffer stringBuffer = new StringBuffer();
        byte[] b =  new String(new char[] { c }).getBytes("gb2312");
        for (int i = 0; i < b.length; i++) {
            stringBuffer.append(Integer.toHexString(b[i] & 0xFF));
        }
        return Integer.parseInt(stringBuffer.toString(), 16);
    }
    /**
     * 排字符串排序
     * 在windows环境的gbk字符集里，汉字是按汉语拼音字典顺序编码的
     * 1.拆分汉字字符串为字符数组，获得每个汉字字符的16进制字符串表示，
     * 2.比较该字符串的字典顺序大小，排序
     * @param list
     * @return
     */
    public static List<String> order(List<String> list){
        if(list != null && list.size() > 0){
            Collections.sort(list, new Comparator<String>(){

                @Override
                public int compare(String o1, String o2) {
                    if(o1 == null) return -1;
                    if(o2 == null) return 1;
                    Integer[] c1 = toIntValueGBK(o1);
                    Integer[] c2 = toIntValueGBK(o2);
                    if(c1.length < c2.length){
                        for (int i = 0; i < c1.length; i++) {
                            if(c1[i] > c2[i]) {
                                return 1;
                            } else if(c1[i] < c2[i]){
                                return -1;
                            }
                        }
                        return -1;
                    } else {
                        for (int i = 0; i < c2.length; i++) {
                            if(c1[i] > c2[i]) {
                                return 1;
                            } else if(c1[i] < c2[i]){
                                return -1;
                            }
                        }
                        return 1;
                    }
                }

            });
        }
        return list;
    }
    public static void main(String[] args) throws Exception {
        UpdateUtils.export("D:\\work\\WorkSpace\\feilipu\\kbase-core\\target\\kbase-core",
                "D:\\Project文档\\知识库相关文档\\2018\\方太\\bak\\2018-10-18");
    }
	/*
	src/main/webapp/WEB-INF/app/biztpl/index_view.jsp
src/main/webapp/WEB-INF/app/biztpl/index_viewBack.jsp
src/main/webapp/resource/biztpl/js/base-ext.js

	 */
}
